/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.pesquisar;

import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.modelo.Endereco;
import br.com.foxinline.modelo.Pessoa;
import br.com.foxinline.modelo.Setor;
import br.com.foxinline.modelo.Usuario;
import br.com.foxinline.servico.PessoaServico;
import br.com.foxinline.servico.SetorServico;
import br.com.foxinline.servico.UsuarioServico;
import br.com.foxinline.util.Caracter;
import br.com.foxinline.util.Msg;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerPesquisarEmpresa implements Serializable {

    @EJB
    UsuarioServico usuarioServico;
    @EJB
    PessoaServico pessoaServico;
    @EJB
    SetorServico setorServico;
    private Pessoa empresaPesquisar;
    private Pessoa empresaEditar;
    private Pessoa empresaVisualizar;
    private Pessoa empresaDelete;
    private List<Pessoa> empresas;
    private Usuario usuarioEditar;
    private List<Usuario> usuariosEditar;
    private List<Usuario> usuariosVisualizar;
    private Endereco enderecoEditar;
    private Endereco enderecoVisualizar;
    private Setor setorEditar;
    private List<Setor> setoresEditar;
    private List<Setor> setoresVisualizar;
    private boolean cnpjCadastrado = false;
    private static final String msgFailure = ":: Erro de validação: o valor é necessário.";
    private String eEmpresa;
    private String vEmpresa;
    private String cnpjAntigo;

    @PostConstruct
    public void init() {
        empresaPesquisar = new Pessoa();
        empresaPesquisar.setTipoDocumento(TipoDocumento.CNPJ);
        empresas = pessoaServico.findEmpresas(10);

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        eEmpresa = params.get("eEmpresa");
        vEmpresa = params.get("vEmpresa");
        paramPost();
    }

    public void paramPost() {
        try {
            if (eEmpresa != null) {
                empresaEditar = pessoaServico.pesquisar(Long.parseLong(eEmpresa));
                if (empresaEditar == null) {
                    empresaEditar = new Pessoa();
                }
                usuariosEditar = empresaEditar.getUsuarios() != null ? empresaEditar.getUsuarios() : new ArrayList<Usuario>();
                empresaEditar.setSetores(empresaEditar.getSetores() != null ? empresaEditar.getSetores() : new ArrayList<Setor>());
                enderecoEditar = empresaEditar.getEndereco();
                usuarioEditar = new Usuario();
                setorEditar = new Setor();
                cnpjAntigo = empresaEditar.getCnpj();
            }
            if (vEmpresa != null) {
                empresaVisualizar = pessoaServico.pesquisar(Long.parseLong(vEmpresa));
                usuariosVisualizar = empresaVisualizar.getUsuarios() != null ? empresaVisualizar.getUsuarios() : new ArrayList<Usuario>();
                setoresVisualizar = empresaVisualizar.getSetores() != null ? empresaVisualizar.getSetores() : new ArrayList<Setor>();
                enderecoVisualizar = empresaVisualizar.getEndereco();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void atualizar() {
        try {
            List<Usuario> usuariosEmpresa = new ArrayList<Usuario>();

            if (!usuariosEditar.isEmpty()) {
                for (Usuario user : usuariosEditar) {
                    if (user.getId() == null) {
                        usuarioServico.salvar(user, true);
                    } else {
                        usuarioServico.atualizar(user);
                    }
                    usuariosEmpresa.add(user);
                }
                empresaEditar.setUsuarios(usuariosEmpresa);
            }
//            if (!setoresEditar.isEmpty()) {
//                for (Setor setor : setoresEditar) {
//                    if (setor.getId() != null) {
//                        setorServico.save(setor);
//                    } else {
//                        setorServico.update(setor);
//                    }
//                }
//                empresaEditar.setSetores(setoresEditar);
//            }
            empresaEditar.setEndereco(enderecoEditar);
            pessoaServico.atualizar(empresaEditar);
            Msg.messagemInfoRedirect(Msg.SuccessFull, "visualizarempresa.xhtml?vEmpresa=" + empresaEditar.getId());
            init();
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void pesquisar() {
        empresas = pessoaServico.find(empresaPesquisar, null);
    }

    public void deletar() {
        try {
            empresas.remove(empresaDelete);
            pessoaServico.remover(empresaDelete);
            Msg.messagemInfo(Msg.SuccessFull);
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void existeCliente() {
        if (!cnpjAntigo.equals(Caracter.removecaracter(empresaEditar.getCnpj()))) {
            if (pessoaServico.existProprietario(empresaEditar) != null) {
                Msg.messagemError("O CNPJ informado já está cadastrado !");
            }
        }
    }

    public String nomeResponsaveis(List<Usuario> usuarios) {

        String nomes = "";
        List<Usuario> responsaveis = new ArrayList<Usuario>();

        for (Usuario user : usuarios) {
            if (user.isResponsavelLegal()) {
                responsaveis.add(user);
            }
        }

        for (int i = 0; i < responsaveis.size(); i++) {

            if (responsaveis.size() > 1 && i > 0) {
                if (i < responsaveis.size() - 1) {
                    nomes += ", ";
                } else {
                    nomes += " e ";
                }
            }

            nomes += responsaveis.get(i).getNome();
        }

        return nomes;
    }

    public void adicionarUsuario() {
        if (isUsuarioValido()) {
            if (!existLogin()) {
                usuariosEditar.add(usuarioEditar);
                usuarioEditar = new Usuario();
            } else {
                Msg.messagemError("Login indisponível !");
            }
        } else {
            RequestContext.getCurrentInstance().execute("requiredUsuario(true)");
        }
    }

    /**
     * Verifica se os campos (Nome, Login e E-mail) do usuário são válidos, ou
     * seja, não são nulos ou contém valores em branco
     *
     * @return <b>true</> caso seja válido, <b>false</b> caso contrário
     */
    private boolean isUsuarioValido() {

        if (usuarioEditar.getNome() == null || usuarioEditar.getNome().equals("")) {
            Msg.messagemError("Nome".concat(msgFailure));
        }

        if (usuarioEditar.getLogin() == null || usuarioEditar.getLogin().equals("")) {
            Msg.messagemError("Login".concat(msgFailure));
        }

        if (usuarioEditar.getEmail() == null || usuarioEditar.getEmail().equals("")) {
            Msg.messagemError("E-mail".concat(msgFailure));
        }

        if ((usuarioEditar.getNome() == null || usuarioEditar.getNome().equals(""))
                || (usuarioEditar.getLogin() == null || usuarioEditar.getLogin().equals(""))
                || (usuarioEditar.getEmail() == null || usuarioEditar.getEmail().equals(""))) {
            return false;
        }

        return true;
    }

    public boolean existLogin() {
        if (usuarioEditar.getId() == null) {
            return usuarioServico.existLogin(usuarioEditar.getLogin()) != null;
        }
        return false;
    }

    public void removerUsuario(Usuario usuario) {
        usuariosEditar.remove(usuario);
    }

    public void editarUsuario(Usuario usuario) {
        this.usuarioEditar = usuario;
        usuariosEditar.remove(usuario);
    }

    public void adicionarSetor() {
        if (setorEditar.getNome() != null && !setorEditar.getNome().equals("")) {
            if (!empresaEditar.getSetores().contains(setorEditar)) {
                empresaEditar.getSetores().add(setorEditar);
                setorEditar = new Setor();
            } else {
                Msg.messagemError("Já existe um setor adicionado com este nome !");
            }
        } else {
            Msg.messagemError("Nome".concat(msgFailure));
            RequestContext.getCurrentInstance().execute("requiredSetor(true)");
        }
    }

    public void removerSetor(Setor setor) {
        setoresEditar.remove(setor);
    }

    public void editarSetor(Setor setor) {
        this.setorEditar = setor;
        empresaEditar.getSetores().remove(setor);
    }
    
    public String cnpjMask(String cnpj){
        return Caracter.addMask(cnpj, Caracter.cnpjMask);
    }

    public Pessoa getEmpresaEditar() {
        return empresaEditar;
    }

    public void setEmpresaEditar(Pessoa empresa) {
        this.empresaEditar = empresa;
    }

    public Endereco getEnderecoEditar() {
        return enderecoEditar;
    }

    public void setEnderecoEditar(Endereco endereco) {
        this.enderecoEditar = endereco;
    }

    public List<Usuario> getUsuariosEditar() {
        return usuariosEditar;
    }

    public void setUsuariosEditar(List<Usuario> usuarios) {
        this.usuariosEditar = usuarios;
    }

    public List<Setor> getSetoresEditar() {
        return setoresEditar;
    }

    public void setSetoresEditar(List<Setor> setores) {
        this.setoresEditar = setores;
    }

    public boolean isCnpjCadastrado() {
        return cnpjCadastrado;
    }

    public void setCnpjCadastrado(boolean cnpjCadastrado) {
        this.cnpjCadastrado = cnpjCadastrado;
    }

    public Usuario getUsuarioEditar() {
        return usuarioEditar;
    }

    public void setUsuarioEditar(Usuario usuario) {
        this.usuarioEditar = usuario;
    }

    public Pessoa getEmpresaPesquisar() {
        return empresaPesquisar;
    }

    public void setEmpresaPesquisar(Pessoa empresaPesquisar) {
        this.empresaPesquisar = empresaPesquisar;
    }

    public Pessoa getEmpresaVisualizar() {
        return empresaVisualizar;
    }

    public void setEmpresaVisualizar(Pessoa empresaVisualizar) {
        this.empresaVisualizar = empresaVisualizar;
    }

    public Endereco getEnderecoVisualizar() {
        return enderecoVisualizar;
    }

    public void setEnderecoVisualizar(Endereco enderecoVisualizar) {
        this.enderecoVisualizar = enderecoVisualizar;
    }

    public List<Pessoa> getEmpresas() {
        return empresas;
    }

    public void setEmpresas(List<Pessoa> empresas) {
        this.empresas = empresas;
    }

    public List<Usuario> getUsuariosVisualizar() {
        return usuariosVisualizar;
    }

    public void setUsuariosVisualizar(List<Usuario> usuariosVisualizar) {
        this.usuariosVisualizar = usuariosVisualizar;
    }

    public List<Setor> getSetoresVisualizar() {
        return setoresVisualizar;
    }

    public void setSetoresVisualizar(List<Setor> setoresVisualizar) {
        this.setoresVisualizar = setoresVisualizar;
    }

    public Pessoa getEmpresaDelete() {
        return empresaDelete;
    }

    public void setEmpresaDelete(Pessoa empresaDelete) {
        this.empresaDelete = empresaDelete;
    }

    public Setor getSetorEditar() {
        return setorEditar;
    }

    public void setSetorEditar(Setor setorEditar) {
        this.setorEditar = setorEditar;
    }
}
